import { PrismaClient } from '@prisma/client';

// 创建Prisma客户端实例
const prisma = new PrismaClient({
  log: process.env.NODE_ENV === 'development' 
    ? ['query', 'error', 'warn'] 
    : ['error'],
  errorFormat: 'pretty',
});

// 优化SQLite配置
async function configureSQLite() {
  try {
    // 启用外键约束
    await prisma.$executeRawUnsafe('PRAGMA foreign_keys = ON');
    
    // 设置WAL模式（提高并发性能）
    await prisma.$executeRawUnsafe('PRAGMA journal_mode = WAL');
    
    // 设置同步模式
    await prisma.$executeRawUnsafe('PRAGMA synchronous = NORMAL');
    
    // 设置缓存大小（64MB）
    await prisma.$executeRawUnsafe('PRAGMA cache_size = -64000');
    
    // 内存映射I/O（256MB）
    await prisma.$executeRawUnsafe('PRAGMA mmap_size = 268435456');
    
    // 临时文件使用内存
    await prisma.$executeRawUnsafe('PRAGMA temp_store = MEMORY');
    
    // 增量清理模式
    await prisma.$executeRawUnsafe('PRAGMA auto_vacuum = INCREMENTAL');
    
    // 设置繁忙超时（10秒）
    await prisma.$executeRawUnsafe('PRAGMA busy_timeout = 10000');
    
    console.log('✓ SQLite配置优化完成');
  } catch (error) {
    console.error('SQLite配置失败:', error);
  }
}

// 连接数据库
export async function connectDatabase() {
  try {
    await prisma.$connect();
    await configureSQLite();
    console.log('✓ 数据库连接成功');
    return prisma;
  } catch (error) {
    console.error('数据库连接失败:', error);
    process.exit(1);
  }
}

// 断开数据库连接
export async function disconnectDatabase() {
  await prisma.$disconnect();
  console.log('✓ 数据库连接已关闭');
}

// 数据库健康检查
export async function checkDatabaseHealth() {
  try {
    await prisma.$queryRaw`SELECT 1`;
    return { healthy: true };
  } catch (error) {
    return { healthy: false, error: error.message };
  }
}

// 优化数据库
export async function optimizeDatabase() {
  try {
    console.log('开始优化数据库...');
    
    // VACUUM
    await prisma.$executeRawUnsafe('VACUUM');
    console.log('✓ VACUUM 完成');
    
    // ANALYZE
    await prisma.$executeRawUnsafe('ANALYZE');
    console.log('✓ ANALYZE 完成');
    
    // REINDEX
    await prisma.$executeRawUnsafe('REINDEX');
    console.log('✓ REINDEX 完成');
    
    // 检查完整性
    const result = await prisma.$queryRawUnsafe('PRAGMA integrity_check');
    console.log('✓ 数据库完整性检查:', result);
    
    return { success: true };
  } catch (error) {
    console.error('数据库优化失败:', error);
    return { success: false, error: error.message };
  }
}

// 获取数据库大小
export async function getDatabaseSize() {
  try {
    const result = await prisma.$queryRawUnsafe('PRAGMA page_count');
    const pageSize = await prisma.$queryRawUnsafe('PRAGMA page_size');
    
    const totalPages = result[0].page_count;
    const bytesPerPage = pageSize[0].page_size;
    const totalBytes = totalPages * bytesPerPage;
    const totalMB = (totalBytes / (1024 * 1024)).toFixed(2);
    
    return {
      bytes: totalBytes,
      mb: totalMB,
      pages: totalPages,
      pageSize: bytesPerPage
    };
  } catch (error) {
    console.error('获取数据库大小失败:', error);
    return null;
  }
}

export default prisma;


